﻿using System;
using System.Reflection;
using System.Text;
using System.Windows;

namespace LunarSF.SHomeWorkshop.LunarMarkdownEditor
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        static App()
        {
            configManager = new XmlConfigManager(Globals.PathOfUserFolder + "config.xml");
            //workspaceConfigManager 是可以变化的，不需要在这里初始化。
        }

        /// <summary>
        /// 2017年12月21日，放弃支持 WinXP 和 .net framework 4.0。
        /// 由于 .net framework 4.5 及以上版本已经解决这个问题，所以此方法已不必要。
        /// 
        /// 这个事件用于处理 WPF 4.0版在对剪贴板操作时存在的 Bug。
        /// 当剪贴板被其它程序占用（监视）时，WPF 4.0 就会出现异常。微软在.net 4.5中修正了这个问题。
        /// 但为了 Windows XP 中也能使用本程序，我只能将.net 版本锁定在 4.0——这是WinXP最后能支持一个.net 版本。
        /// 
        /// 事实上，这个办法的原理是反复尝试向剪贴板进行操作，仍然可能造成UI假死，并不是个完美的解决方案。
        /// 另，有人实测使用Clipboard.SetData()方法取代Clipboard.SetText()方法比较好用。
        /// 这个还需要进一步测试。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        //{
        //    var comException = e.Exception as System.Runtime.InteropServices.COMException;
        //    if (comException != null && comException.ErrorCode == -2147221040)///OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
        //        e.Handled = true;
        //}

        private static XmlConfigManager configManager;
        /// <summary>
        /// 用于保存配置的Xml配置管理器。
        /// </summary>
        public static XmlConfigManager ConfigManager
        {
            get { return configManager; }
        }

        private static XmlConfigManager workspaceConfigManager = null;
        /// <summary>
        /// 工作区配置文件管理器。
        /// </summary>
        public static XmlConfigManager WorkspaceConfigManager
        {
            get
            {
                if (workspaceConfigManager == null)
                {
                    workspaceConfigManager = new XmlConfigManager(Globals.PathOfWorkspace + "Configure.xml");
                }

                return workspaceConfigManager;
            }
            set { workspaceConfigManager = value; }
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {

            // 解决Win10下菜单面板向左打开的问题。
            var ifLeft = SystemParameters.MenuDropAlignment;
            if (ifLeft)
            {
                var t = typeof(SystemParameters);
                var field = t.GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
                field.SetValue(null, false);
            }


            //★，注意，以后不能开发带多参数的功能；实在必须开发这样的功能，须别作处理。

            Globals.args = e.Args;

            if (e.Args.Length > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (var arg in e.Args)
                {
                    sb.Append(arg);
                    sb.Append(" ");
                }

                Globals.CmdParameterString = sb.ToString().Trim(new char[] { ' ' });

                //LMessageBox.Show(sb.ToString());

                if (Globals.CmdParameterString.Contains(" "))
                {
                    if (Globals.CmdParameterString.StartsWith("\"") == false)
                        Globals.CmdParameterString = "\"" + Globals.CmdParameterString;
                    if (Globals.CmdParameterString.EndsWith("\"") == false)
                        Globals.CmdParameterString += "\"";
                }
            }
            else
            {
                Globals.CmdParameterString = "";
            }
        }

        // 用于解决程序集版本冲突，后来还是用配置文件解决了问题。2023年11月9日
        //private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        //{
        //    // 忽略一切版本号，解决不同版本引用的冲突！！！
        //    var name = new AssemblyName(args.Name);
        //    if (name.Name == "System.Runtime.CompilerServices.Unsafe")
        //    {
        //        return typeof(System.Runtime.CompilerServices.Unsafe).Assembly;
        //    }
        //    return null;
        //}

        private void Application_Exit(object sender, ExitEventArgs e)
        {
            // 云电脑上支持快速关闭 Windows 系统，结果总是造成工作区配置文件被破坏。
            // 加个保存试试看能不能解决问题。
            // 2018年11月26日
            if (workspaceConfigManager != null)
            {
                workspaceConfigManager.Save();
            }

            if (configManager != null)
            {
                configManager.Save();
            }
        }
    }
}
